/*
 * @Author: PoJun
 * @Date: 2024-06-20 15:39:41
 * @LastEditors: PoJun
 * @LastEditTime: 2024-07-05 16:02:46
 * @Message: Nothing
 */
export default (() => {
  function modifyThePath(config, type) {
    // #ifdef H5
    config.baseURL =
      process.env.NODE_ENV == "development"
        ? type === "img"
          ? "/img"
          : "/api"
        : type === "img"
        ? process.env.VUE_APP_BASE_IMG_API
        : process.env.VUE_APP_BASE_API
    // #endif

    // #ifndef H5
    config.baseURL =
      type === "img" ? process.env.VUE_APP_BASE_IMG_API : process.env.VUE_APP_BASE_API
    // #endif
  }

  // 初始化请求配置
  uni.$uv.http.setConfig(config => {
    modifyThePath(config)

    return config
  })

  // 请求拦截
  uni.$uv.http.interceptors.request.use(
    config => {
      // 可使用async await 做异步操作
      // 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
      config.data = config.data || {}
      // 根据custom参数中配置的是否需要token，默认需要, 添加对应的请求头
      const { custom } = config

      if (custom?.useImage) {
        modifyThePath(config, "img")
        return config
      }

      if (!custom?.noAuth) {
        const vuex_token = uni.getStorageSync("vuex_token")
        config.header.satoken = vuex_token
      }
      return config
    },
    config => {
      // 可使用async await 做异步操作
      return Promise.reject(config)
    }
  )

  // 响应拦截
  uni.$uv.http.interceptors.response.use(
    response => {
      /* 对响应成功做点什么 可使用async await 做异步操作*/
      const { data, config } = response
      // 自定义参数
      const { custom } = config
      // 这里图片的请求单独处理
      if (custom.useImage) {
        return data
      }

      if (data.code !== 200) {
        // 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
        if (custom.toast !== false) {
          uni.$uv.toast(data.message)
        }

        // 如果需要catch返回，则进行reject
        if (custom?.catch) {
          return Promise.reject(data)
        } else {
          // 否则返回一个pending中的promise，请求不会进入catch中
          return new Promise(() => {
            console.log("请求被终止")
          })
        }
      }

      // 主动要求提示的话就发一个
      if (custom.toast) {
        uni.$uv.toast(data.message)
      }

      return data.data === undefined ? {} : data.data
    },
    response => {
      // 对响应错误做点什么
      return Promise.reject(response)
    }
  )
})()
